// CFDictionaryRef Ç©ÇÁ int ÇéÊìæÇ∑ÇÈä»à’ä÷êî
static int GetIntFromDictionaryForKey( CFDictionaryRef desc, CFStringRef key )
{
CFNumberRef value;
int num = 0;
if ( (value = CFDictionaryGetValue(desc, key)) == NULL
|| CFGetTypeID(value) != CFNumberGetTypeID())
return 0;
CFNumberGetValue(value, kCFNumberIntType, &num);
return num;
}
CGDisplayErr GetDisplayDPI(
CFDictionaryRef displayModeDict,
CGDirectDisplayID displayID,
double *horizontalDPI, double *verticalDPI )
{
CGDisplayErr err = kCGErrorFailure;
io_connect_t displayPort;
CFDictionaryRef displayDict;
// óvãÅÇ≥ÇÍÇΩÉfÉBÉXÉvÉåÉCÇÃÇΩÇflÇ… IOKit Ç÷ê⁄ë±èÓïÒÇéÊÇËçûÇfi
displayPort = CGDisplayIOServicePort( displayID );
if ( displayPort != MACH_PORT_NULL )
{
// DZÇÃÉfÉBÉXÉvÉåÉCDžǬǢǃ IOKit Ç™éùǡǃǢÇÈèÓïÒÇí≤ÇÈ
displayDict = IOCreateDisplayInfoDictionary(displayPort, 0);
if ( displayDict != NULL )
{
const double mmPerInch = 25.4;
double horizontalSizeInInches =
(double)GetIntFromDictionaryForKey(displayDict,
CFSTR(kDisplayHorizontalImageSize)) / mmPerInch;
double verticalSizeInInches =
(double)GetIntFromDictionaryForKey(displayDict,
CFSTR(kDisplayVerticalImageSize)) / mmPerInch;
// IOKit Ç©ÇÁéÊìæÇµÇΩÉfÉBÉNÉVÉáÉiÉäÇïKÇ∏âï˙Ç∑ÇÈDZÇΔ
CFRelease(displayDict);
// DZÇÍÇ≈ÅAdisplayModeDict Ç©ÇÁÇÃèÓïÒÇégóp
// ǵǃÅAé¿ç€Çà DPI ÇåvéZÇ∑ÇÈDZÇΔÇ™Ç≈Ç´ÇÈ
*horizontalDPI =
(double)GetIntFromDictionaryForKey( displayModeDict, kCGDisplayWidth )
/ horizontalSizeInInches;
*verticalDPI = (double)GetIntFromDictionaryForKey( displayModeDict,
kCGDisplayHeight ) / verticalSizeInInches;
err = CGDisplayNoErr;
}
}
return err;
}
|